import java.awt.*;

import javax.swing.*;



public class CharacterDisplayCanvas extends JComponent implements CharacterListener {

    protected FontMetrics fm;

    protected char[] tmpChar = new char[1];

    protected int fontHeight;



    public CharacterDisplayCanvas( ) {

        setFont(new Font("Monospaced", Font.BOLD, 18));

        fm = Toolkit.getDefaultToolkit( ).getFontMetrics(getFont( ));

        fontHeight = fm.getHeight( );

    }



    public CharacterDisplayCanvas(CharacterSource cs) {

        this( );

        setCharacterSource(cs);

    }



    public void setCharacterSource(CharacterSource cs) {

        cs.addCharacterListener(this);

    }



    public Dimension preferredSize( ) {

        return new Dimension(fm.getMaxAscent( ) + 10,

                             fm.getMaxAdvance( ) + 10);

    }



    public synchronized void newCharacter(CharacterEvent ce) {

        tmpChar[0] = (char) ce.character;

        repaint( );

    }



    protected synchronized void paintComponent(Graphics gc) {

        Dimension d = getSize( );

        gc.clearRect(0, 0, d.width, d.height);

        if (tmpChar[0] == 0)

            return;

        int charWidth = fm.charWidth((int) tmpChar[0]);

        gc.drawChars(tmpChar, 0, 1,

                     (d.width - charWidth) / 2, fontHeight);

    }

}